<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 统计字符串字符出现的次数 -->
</body>
</html>
<script>
    let num = ["a,b", "b,c", "f,h,c,d,a,b,c,j,a,b", "g","", "a,i"];
    function Norepeat(num) {
        let newArr = [];//先定义一个新的数组，等会把每次循环得到的字符串放到里面；
        for (let i = 0; i < num.length; i++) {//这个数组中有五个数组元素
            let newStr = "";//声明一个空的字符串，一定要把这个变量定义在外层for循环的里面，因为每次循环都要保证这个字符串是空字符串，用于每次过滤得到的新字符串的拼接
            let newArrStr = newArr.join(",");//将刚才定义的新数组转换成字符串，当进行第二次循环的时候，把第一次得到的新数组转换成字符串，方便下面的"元素过滤"，以此类推；
            let arr1 = num[i].split(",");//[a,b] [b,c] [f,h,c] [g] [a,i]
            let arr2 = [];//定义一个新的空数组，等会把每次（单次）循环过滤arr1后得到的新数组元素放到里面
            for (let j = 0; j < arr1.length; j++) {//循环遍历第一个原数组的第一个数组元素 arr1=>[a,b]
                if (!newArrStr.includes(arr1[j])) {//判断字符串里是否包含数组里的数组元素，不包含的话，执行里面的代码体
                    arr2.push(arr1[j]);//将过滤后的数组元素插入到空数组arr2中
                }
            }
            for (let a = 0; a < arr2.length; a++) {//循环遍历数组arr2
                if (arr2.length == 1) {//如果得到的过滤后的新数组的长度为1，说明只有一个元素，后面就不需要拼接逗号(,) ,
                    newStr = newStr + arr2[a] + ""; //后面就不需要拼接逗号(,) 
                } else {//如果长度不是1，则执行下面的代码
                    newStr = newStr + arr2[a] + (arr2[a] != arr2[arr2.length - 1] ? "," : "")//从第一个数组元素开始到倒数第二个数组元素的后面都需要拼接一个逗号(,) ;最后一个数组元素不需要拼接逗号，
                }
            }
            if (newStr) {//判断一下得到的字符串是否为空(""),如果不为空，则执行里面的代码体
                newArr.push(newStr);
            }
        }
        return newArr;//最后，等最外层循环走完后，返回出 最终的数组
    }
    console.log(Norepeat(num));
</script> 